home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / mesa / mesa-tk / samples.tk / fog.c < prev    next >
C/C++ Source or Header  |  2000-02-23  |  7KB  |  336 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30. GLenum rgb, doubleBuffer, directRender;
  31.  
  32. double plane[4] =
  33. {
  34.   1.0, 0.0, -1.0, 0.0
  35. };
  36. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  37. float fogDensity = 0.02;
  38. GLint cubeList = 1;
  39.  
  40. float scp[18][3] =
  41. {
  42.   {
  43.     1.000000, 0.000000, 0.000000
  44.   },
  45.   {
  46.     1.000000, 0.000000, 5.000000
  47.   },
  48.   {
  49.     0.707107, 0.707107, 0.000000
  50.   },
  51.   {
  52.     0.707107, 0.707107, 5.000000
  53.   },
  54.   {
  55.     0.000000, 1.000000, 0.000000
  56.   },
  57.   {
  58.     0.000000, 1.000000, 5.000000
  59.   },
  60.   {
  61.     -0.707107, 0.707107, 0.000000
  62.   },
  63.   {
  64.     -0.707107, 0.707107, 5.000000
  65.   },
  66.   {
  67.     -1.000000, 0.000000, 0.000000
  68.   },
  69.   {
  70.     -1.000000, 0.000000, 5.000000
  71.   },
  72.   {
  73.     -0.707107, -0.707107, 0.000000
  74.   },
  75.   {
  76.     -0.707107, -0.707107, 5.000000
  77.   },
  78.   {
  79.     0.000000, -1.000000, 0.000000
  80.   },
  81.   {
  82.     0.000000, -1.000000, 5.000000
  83.   },
  84.   {
  85.     0.707107, -0.707107, 0.000000
  86.   },
  87.   {
  88.     0.707107, -0.707107, 5.000000
  89.   },
  90.   {
  91.     1.000000, 0.000000, 0.000000
  92.   },
  93.   {
  94.     1.000000, 0.000000, 5.000000
  95.   },
  96. };
  97.  
  98. static void Build_lists(void)
  99. {
  100.  
  101.   glNewList(cubeList, GL_COMPILE);
  102.   glBegin(GL_TRIANGLE_STRIP);
  103.   glNormal3fv(scp[0]);
  104.   glVertex3fv(scp[0]);
  105.   glNormal3fv(scp[0]);
  106.   glVertex3fv(scp[1]);
  107.   glNormal3fv(scp[2]);
  108.   glVertex3fv(scp[2]);
  109.   glNormal3fv(scp[2]);
  110.   glVertex3fv(scp[3]);
  111.   glNormal3fv(scp[4]);
  112.   glVertex3fv(scp[4]);
  113.   glNormal3fv(scp[4]);
  114.   glVertex3fv(scp[5]);
  115.   glNormal3fv(scp[6]);
  116.   glVertex3fv(scp[6]);
  117.   glNormal3fv(scp[6]);
  118.   glVertex3fv(scp[7]);
  119.   glNormal3fv(scp[8]);
  120.   glVertex3fv(scp[8]);
  121.   glNormal3fv(scp[8]);
  122.   glVertex3fv(scp[9]);
  123.   glNormal3fv(scp[10]);
  124.   glVertex3fv(scp[10]);
  125.   glNormal3fv(scp[10]);
  126.   glVertex3fv(scp[11]);
  127.   glNormal3fv(scp[12]);
  128.   glVertex3fv(scp[12]);
  129.   glNormal3fv(scp[12]);
  130.   glVertex3fv(scp[13]);
  131.   glNormal3fv(scp[14]);
  132.   glVertex3fv(scp[14]);
  133.   glNormal3fv(scp[14]);
  134.   glVertex3fv(scp[15]);
  135.   glNormal3fv(scp[16]);
  136.   glVertex3fv(scp[16]);
  137.   glNormal3fv(scp[16]);
  138.   glVertex3fv(scp[17]);
  139.   glEnd();
  140.   glEndList();
  141. }
  142.  
  143. static void Init(void)
  144. {
  145.   static float ambient[] =
  146.   {0.1, 0.1, 0.1, 1.0};
  147.   static float diffuse[] =
  148.   {1.0, 1.0, 1.0, 1.0};
  149.   static float position[] =
  150.   {90.0, 90.0, 0.0, 0.0};
  151.   static float front_mat_shininess[] =
  152.   {30.0};
  153.   static float front_mat_specular[] =
  154.   {0.0, 0.0, 0.0, 1.0};
  155.   static float front_mat_diffuse[] =
  156.   {0.0, 1.0, 0.0, 1.0};
  157.   static float back_mat_shininess[] =
  158.   {50.0};
  159.   static float back_mat_specular[] =
  160.   {0.0, 0.0, 1.0, 1.0};
  161.   static float back_mat_diffuse[] =
  162.   {1.0, 0.0, 0.0, 1.0};
  163.   static float lmodel_ambient[] =
  164.   {0.0, 0.0, 0.0, 1.0};
  165.   static float fog_color[] =
  166.   {0.8, 0.8, 0.8, 1.0};
  167.  
  168.   glFrontFace(GL_CW);
  169.  
  170.   glEnable(GL_DEPTH_TEST);
  171.  
  172.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  173.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  174.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  175.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  176.   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  177.   glEnable(GL_LIGHTING);
  178.   glEnable(GL_LIGHT0);
  179.  
  180.   glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  181.   glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  182.   glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  183.   glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  184.   glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  185.   glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  186.  
  187.   glEnable(GL_FOG);
  188.   glFogi(GL_FOG_MODE, GL_EXP);
  189.   glFogf(GL_FOG_DENSITY, fogDensity);
  190.   if (rgb) {
  191.     glFogfv(GL_FOG_COLOR, fog_color);
  192.     glClearColor(0.8, 0.8, 0.8, 1.0);
  193.   }
  194.   else {
  195.     glFogi(GL_FOG_INDEX, 1 << 5);
  196.     tkSetFogRamp(5, 3);
  197.     glClearIndex(128);
  198.   }
  199.  
  200.   Build_lists();
  201. }
  202.  
  203. static void Reshape(int width, int height)
  204. {
  205.  
  206.   glViewport(0, 0, (GLint) width, (GLint) height);
  207.  
  208.   glMatrixMode(GL_PROJECTION);
  209.   glLoadIdentity();
  210.   gluPerspective(45.0, 1.0, 1.0, 200.0);
  211.   glMatrixMode(GL_MODELVIEW);
  212. }
  213.  
  214. static GLenum Key(int key, GLenum mask)
  215. {
  216.  
  217.   switch (key) {
  218.     case TK_ESCAPE:
  219.       tkQuit();
  220.     case TK_UP:
  221.       rotX -= 5;
  222.       break;
  223.     case TK_DOWN:
  224.       rotX += 5;
  225.       break;
  226.     case TK_LEFT:
  227.       rotY -= 5;
  228.       break;
  229.     case TK_RIGHT:
  230.       rotY += 5;
  231.       break;
  232.     case TK_D:
  233.       if (rgb) {
  234.     fogDensity *= 1.10;
  235.     glFogf(GL_FOG_DENSITY, fogDensity);
  236.       }
  237.       break;
  238.     case TK_d:
  239.       if (rgb) {
  240.     fogDensity /= 1.10;
  241.     glFogf(GL_FOG_DENSITY, fogDensity);
  242.       }
  243.       break;
  244.     default:
  245.       return GL_FALSE;
  246.   }
  247.   return GL_TRUE;
  248. }
  249.  
  250. static void Draw(void)
  251. {
  252.  
  253.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  254.  
  255.   glPushMatrix();
  256.  
  257.   glTranslatef(0, 0, zTranslate);
  258.   glRotatef(rotY, 0, 1, 0);
  259.   glRotatef(rotX, 1, 0, 0);
  260.   glScalef(1.0, 1.0, 10.0);
  261.  
  262.   glCallList(cubeList);
  263.  
  264.   glPopMatrix();
  265.  
  266.   glFlush();
  267.  
  268.   if (doubleBuffer) {
  269.     tkSwapBuffers();
  270.   }
  271. }
  272.  
  273. static GLenum Args(int argc, char **argv)
  274. {
  275.   GLint i;
  276.  
  277.   rgb = GL_TRUE;
  278.   doubleBuffer = GL_FALSE;
  279.   directRender = GL_TRUE;
  280.  
  281.   for (i = 1; i < argc; i++) {
  282.     if (strcmp(argv[i], "-ci") == 0) {
  283.       rgb = GL_FALSE;
  284.     }
  285.     else if (strcmp(argv[i], "-rgb") == 0) {
  286.       rgb = GL_TRUE;
  287.     }
  288.     else if (strcmp(argv[i], "-sb") == 0) {
  289.       doubleBuffer = GL_FALSE;
  290.     }
  291.     else if (strcmp(argv[i], "-db") == 0) {
  292.       doubleBuffer = GL_TRUE;
  293.     }
  294.     else if (strcmp(argv[i], "-dr") == 0) {
  295.       directRender = GL_TRUE;
  296.     }
  297.     else if (strcmp(argv[i], "-ir") == 0) {
  298.       directRender = GL_FALSE;
  299.     }
  300.     else {
  301.       printf("%s (Bad option).\n", argv[i]);
  302.       return GL_FALSE;
  303.     }
  304.   }
  305.   return GL_TRUE;
  306. }
  307.  
  308. void main(int argc, char **argv)
  309. {
  310.   GLenum type;
  311.  
  312.   if (Args(argc, argv) == GL_FALSE) {
  313.     tkQuit();
  314.   }
  315.  
  316.   tkInitPosition(0, 0, 300, 300);
  317.  
  318.   type = TK_DEPTH;
  319.   type |= (rgb) ? TK_RGB : TK_INDEX;
  320.   type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  321.   type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  322.   tkInitDisplayMode(type);
  323.  
  324.   if (tkInitWindow("Fog Test") == GL_FALSE) {
  325.     tkQuit();
  326.   }
  327.  
  328.   Init();
  329.  
  330.   tkExposeFunc(Reshape);
  331.   tkReshapeFunc(Reshape);
  332.   tkKeyDownFunc(Key);
  333.   tkDisplayFunc(Draw);
  334.   tkExec();
  335. }
  336.